"""
修复 secure_cookie 库与新版本 werkzeug 的兼容性问题
"""

import sys

def patch_secure_cookie():
    """
    修复 secure_cookie 与新版本 werkzeug 的兼容性问题
    """
    # 修复 safe_str_cmp 问题
    try:
        from werkzeug.security import safe_str_cmp
        print("✅ werkzeug.security.safe_str_cmp 可用")
    except ImportError:
        import hmac
        
        def safe_str_cmp(a, b):
            """
            安全字符串比较函数，替代 werkzeug.security.safe_str_cmp
            使用 hmac.compare_digest 来防止时序攻击
            """
            if isinstance(a, str):
                a = a.encode('utf-8')
            if isinstance(b, str):
                b = b.encode('utf-8')
            return hmac.compare_digest(a, b)
        
        # 将函数注入到 werkzeug.security 模块中
        import werkzeug.security
        werkzeug.security.safe_str_cmp = safe_str_cmp
        print("✅ 已修复 secure_cookie 兼容性问题 - 注入了 safe_str_cmp 函数")

    # 修复 url_quote_plus 问题
    try:
        from werkzeug.urls import url_quote_plus
        print("✅ werkzeug.urls.url_quote_plus 可用")
    except ImportError:
        try:
            # 在新版本的 werkzeug 中，url_quote_plus 可能在其他位置
            from urllib.parse import quote_plus as url_quote_plus
            
            # 将函数注入到 werkzeug.urls 模块中
            import werkzeug.urls
            werkzeug.urls.url_quote_plus = url_quote_plus
            print("✅ 已修复 werkzeug.urls.url_quote_plus 兼容性问题")
        except ImportError:
            # 如果仍然失败，创建一个简单的实现
            from urllib.parse import quote_plus
            
            def url_quote_plus(string, charset='utf-8', safe=''):
                """
                URL编码函数，替代 werkzeug.urls.url_quote_plus
                """
                if isinstance(string, str):
                    string = string.encode(charset)
                return quote_plus(string, safe=safe)
            
            import werkzeug.urls
            werkzeug.urls.url_quote_plus = url_quote_plus
            print("✅ 已修复 werkzeug.urls.url_quote_plus 兼容性问题 - 使用自定义实现")

    # 修复其他可能的 werkzeug 兼容性问题
    try:
        from werkzeug.urls import url_unquote_plus
        print("✅ werkzeug.urls.url_unquote_plus 可用")
    except ImportError:
        try:
            from urllib.parse import unquote_plus as url_unquote_plus
            import werkzeug.urls
            werkzeug.urls.url_unquote_plus = url_unquote_plus
            print("✅ 已修复 werkzeug.urls.url_unquote_plus 兼容性问题")
        except ImportError:
            from urllib.parse import unquote_plus
            
            def url_unquote_plus(string, charset='utf-8'):
                """
                URL解码函数，替代 werkzeug.urls.url_unquote_plus
                """
                return unquote_plus(string)
            
            import werkzeug.urls
            werkzeug.urls.url_unquote_plus = url_unquote_plus
            print("✅ 已修复 werkzeug.urls.url_unquote_plus 兼容性问题 - 使用自定义实现")

    # 修复可能的其他导入问题
    try:
        from werkzeug.urls import url_quote
        print("✅ werkzeug.urls.url_quote 可用")
    except ImportError:
        try:
            from urllib.parse import quote as url_quote
            import werkzeug.urls
            werkzeug.urls.url_quote = url_quote
            print("✅ 已修复 werkzeug.urls.url_quote 兼容性问题")
        except ImportError:
            from urllib.parse import quote
            
            def url_quote(string, charset='utf-8', safe='/:'):
                """
                URL编码函数，替代 werkzeug.urls.url_quote
                """
                if isinstance(string, str):
                    string = string.encode(charset)
                return quote(string, safe=safe)
            
            import werkzeug.urls
            werkzeug.urls.url_quote = url_quote
            print("✅ 已修复 werkzeug.urls.url_quote 兼容性问题 - 使用自定义实现")

    # 修复 detect_utf_encoding 问题
    try:
        from werkzeug.utils import detect_utf_encoding
        print("✅ werkzeug.utils.detect_utf_encoding 可用")
    except ImportError:
        import codecs
        
        def detect_utf_encoding(data):
            """
            检测UTF编码，替代 werkzeug.utils.detect_utf_encoding
            """
            if isinstance(data, str):
                return 'utf-8'
            
            # 尝试检测 BOM
            for bom, encoding in [
                (codecs.BOM_UTF8, 'utf-8-sig'),
                (codecs.BOM_UTF32_BE, 'utf-32-be'),
                (codecs.BOM_UTF32_LE, 'utf-32-le'),
                (codecs.BOM_UTF16_BE, 'utf-16-be'),
                (codecs.BOM_UTF16_LE, 'utf-16-le'),
            ]:
                if data.startswith(bom):
                    return encoding
            
            # 默认返回 utf-8
            return 'utf-8'
        
        import werkzeug.utils
        werkzeug.utils.detect_utf_encoding = detect_utf_encoding
        print("✅ 已修复 werkzeug.utils.detect_utf_encoding 兼容性问题")

    # 修复可能的其他 werkzeug.utils 导入问题
    try:
        from werkzeug.utils import cached_property
        print("✅ werkzeug.utils.cached_property 可用")
    except ImportError:
        try:
            from functools import cached_property
            import werkzeug.utils
            werkzeug.utils.cached_property = cached_property
            print("✅ 已修复 werkzeug.utils.cached_property 兼容性问题")
        except ImportError:
            # 为旧版本 Python 提供 cached_property 实现
            class cached_property:
                """
                简单的 cached_property 实现
                """
                def __init__(self, func):
                    self.func = func
                    self.__doc__ = func.__doc__
                    self.__name__ = func.__name__
                
                def __get__(self, obj, cls):
                    if obj is None:
                        return self
                    value = obj.__dict__[self.__name__] = self.func(obj)
                    return value
            
            import werkzeug.utils
            werkzeug.utils.cached_property = cached_property
            print("✅ 已修复 werkzeug.utils.cached_property 兼容性问题 - 使用自定义实现")

# 应用补丁
if __name__ != "__main__":
    patch_secure_cookie()